package com.lxyk.mapper;

import com.lxyk.pojo.Dept;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;

import java.util.List;

@Mapper //这里只有一个接口 用mapper注解就行 就不用在启动类写@MapperScan
@Repository
public interface DeptMapper {
    List<Dept> GetAll();

    Dept selectByID(Integer deptNo);

    /*说一下几个注解(到现在才搞明白):
    * @Mapper和@MapperScan：两者的作用是一样的，但是作用范围不一样，在接口类上添加了@Mapper，在编译之后会生成相应的接口实现类，如果你一个项目有
    * 很多接口，如果你只用@Mapper，那就要在每个接口上加一个@Mapper，如果你想简单点，只在启动类上加一个@MapperScan注解并指定路径即可，@Mapper是
    * 只让一个接口生成相应的实现类，而@MapperScan能让所有接口生成响应实现类，我们之前的项目都用的是@MapperScan，没用过@Mapper，只用@Mapper也能实现
    *
    * @Mapper和@Repository：@Mapper目的就是为了不再写mapper映射文件，在接口上添加@Mapper注解之后这个接口在编译时会生成相应的实现类，
    * 而@Repository是将接口的一个实现类交给spring管理，当哪些地方需要用到这个实现类作为时，就可以用@Autowired注入并使用，如果只用@Mapper或
    * @MapperScan，那就只实现了接口在编译时会生成相应的实现类，但是并没有交给spring管理，这时候用@Autowired就会有红色波浪线，说明在spring中
    * 没有找到这个实现类，但是你看这个java文件并没有报错，只是有个红色波浪线，代码运行完全没问题，说明不把mapper接口的实现类交给spring管理也完全没问题，
    * 如果你想去掉红色波浪线，那你就在接口上加个@Repository，把该接口的实现类交给spring管理，因为@Repository和@Autowired都是spring的注解，
    * @Mapper是mybatis的注解(当然不会交给spring管理，只有spring的注解才有"交给spring管理"的功能)，加上@Repository交给spring管理之后，
    * @Autowired当然能找到由spring管理的实现类，就不会有波浪线了。总而言之，之前的项目加@Repository注解的作用只有一个，那就是为了去掉红色波浪线
    * 而它又没有@MapperScan这种范围性的注解，所以只能在每个接口上都加上@Repository(也可以用@Component代替，都是为了声明bean)，不写这个注解完全
    * 不影响项目运行，而@Mapper或@MapperScan是必须要写的，因为他们是mybatis的注解，作用是代替了mapper映射文件，就是让每个mapper接口和对应xml文件关联起来，它可不能省
    *
    * 总结
       1 @Mapper 一定要有，否则 Mybatis 找不到 mapper。
       2 @Repository 可有可无，可以消去依赖注入的报错信息。
       3 @MapperScan 可以替代 @Mapper。但是依然解决不了，IDE注入红线的问题。
       4 最终得出答案：@Mapper(或@MapperScan)和@Repository 同时使用，完美解决所有问题。
       *
       *
       * 另外：@Repository、@Service、@Controller，它们分别对应存储层Bean，业务层Bean，和展示层Bean。主旨都是把实现类交给spring管理
       * @Repository用在接口上，@Service、@Controller用在类上*/


}
